home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Alles Voor Internet / Tout Pour Internet
/
alles voor internet.iso
/
MacInternet™
/
Telnet
/
NCSA
/
tn3270 2.4d7 source
/
tn3270
/
settings.c
< prev
next >
Wrap
Text File
|
1992-04-17
|
36KB
|
1,325 lines
/*
* tn3270 for the Macintosh Source Code
* Brown University Computing and Information Services
* Version 2.4d7 April, 1992
* Copyright (c) 1988, 1989, 1990, 1991, 1992 by Brown University and by
* Peter John DiCamillo.
*
* Permission is granted to any individual or institution to use, copy,
* or redistribute the binary version of this software and its
* documentation provided this notice and the copyright notices are
* retained. Permission is granted to any individual or non-profit
* institution to use, copy, modify, or redistribute the source files
* of this software provided this notice and the copyright notices are
* retained. This software may not be distributed for profit, either
* in original form or in derivative works, nor can the source be
* distributed to other than an individual or a non-profit institution.
* Any individual or group interested in seeing and/or using these
* source files but who are prevented from doing so by the above
* constraints should contact Don Wolfe, Assistant Vice-President for
* Computer Systems at Brown University, (401) 863-7250, for possible
* software licensing of the source developed at Brown.
*
* Brown University and Peter John DiCamillo make no representations
* about the suitability of this software for any purpose.
*
* BROWN UNIVERSITY AND PETER JOHN DICAMILLO GIVE NO WARRANTY, EITHER
* EXPRESS OR IMPLIED, FOR THE PROGRAM AND/OR DOCUMENTATION PROVIDED,
* INCLUDING, WITHOUT LIMITATION, WARRANTY OF MERCHANTABILITY AND
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#if !defined(USEDUMP)
#include "maclib.h"
#include "termdef.h"
#include "tn3270funcs.h"
#include "globals.h"
#else
#pragma load "tn3270DumpFile"
#endif
#define WRITEBUFFSIZE 256
#pragma segment 3270seg3
extern struct Point sfppoint, sfgpoint;
static char dlgautoconn;
keyinfo keytab[] = {
{"host_name", 's', 255, nshostname, "Host name", 0},
{"window_title", 's', 255, nswtitle, "Window title", 0},
{"default_ptsize", 'i', 2, &ns.dfltptsize, "Default (24-by-80) point size", ptsizeproc},
{"alt_ptsize", 'i', 2, &ns.altptsize, "Alternate screen point size", ptsizeproc},
{"alt_rows", 'i', 2, &ns.altrows, "Alternate screen rows", rowproc},
{"alt_cols", 'i', 2, &ns.altcols, "Alternate screen columns", colproc},
{"custom_rows", 'i', 2, &ns.custrows, "Custom size rows", rowproc},
{"custom_cols", 'i', 2, &ns.custcols, "Custom size columns", colproc},
{"max_window_size", 'b', 1, &ns.windmax, "Always use window size for largest screen size (flag)", 0},
{"save_window_pos", 'c', 1, &ns.savewpos, "Save window position: 0 = no, 1 = yes, 2 = saved in this file", max2proc},
{"window_hloc", 'i', 2, &ns.windpth, "Window center point- horizontal position", 0},
{"window_vloc", 'i', 2, &ns.windptv, "Window center point- vertical position", 0},
{"text_creator", 'o', 4, &ns.text_creator, "Text file creator signature", 0},
{"ext_datastream", 'b', 1, &ns.ext3270, "Support extended datastreams (flag)", 0},
{"no_graphics", 'b', 1, &ns.nographics, "Don't allocate graphics bitmap (flag)", 0},
{"no_color", 'b', 1, &ns.nocolor, "Use B&W regardless of monitor setting (flag)", 0},
{"insert_reset", 'b', 1, &ns.insreset, "Attention key resets insert mode (flag)", 0},
{"imp_null", 'b', 1, &ns.impnull, "Improved nulls processing (flag)", 0},
{"replace_nulls", 'b', 1, &ns.repnull, "Change embedded blanks to nulls (flag)", 0},
{"digitpfk", 'b', 1, &ns.digitpfk, "Cmd Shift <digit> is PF (flag)", 0},
{"std_brackets", 'b', 1, &ns.std_brack, "Treat [ and ] as normal characters (flag)", 0},
{"double-click", 'i', 2, &ns.mousepf, "Double-click action", pfproc},
{"attribute_settings", 'l', 7, ns.attrmap, "Highlighting attribute settings", 0},
{"white", 'r', 3, &ns.usrwhite, "RGB values for white", 0},
{"yellow", 'r', 3, &ns.usryellow, "RGB values for yellow", 0},
{"pink", 'r', 3, &ns.usrpink, "RGB values for pink", 0},
{"turquoise", 'r', 3, &ns.usrturquoise, "RGB values for turquoise", 0},
{"green", 'r', 3, &ns.usrgreen, "RGB values for green", 0},
{"red", 'r', 3, &ns.usrred, "RGB values for red", 0},
{"blue", 'r', 3, &ns.usrblue, "RGB values for blue", 0},
{"black", 'r', 3, &ns.usrblack, "RGB values for black", 0},
{"bkgr_color", 'r', 3, &ns.usrback, "RGB values for background color", 0},
{"status_color", 'r', 3, &ns.usrstat, "RGB values status line color", 0},
{"exact_colors", 'b', 1, &ns.exactcolor, "Use exact colors (flag)", 0},
{"base_color", 'b', 1, &ns.basecolor, "Base color mode (flag)", 0},
{"swap_bw", 'b', 1, &ns.invertbw, "Swap black and white colors (flag)", 0},
{"simulate_ps", 'b', 1, &ns.simps, "Tell host programmed symbols are supported (flag)", 0},
{"time_display", 'c', 1, &ns.stat_time, "Status line time: 0 = off, 1 = 12-hr., 2 = 24-hr.", max2proc},
{"block_cursor", 'b', 1, &ns.blockcurs, "Use block cursor (flag)", 0},
{"cursor_position", 'b', 1, &ns.curpos, "Display cursor position (flag)", 0},
{"auto_open", 'b', 1, &ns.autoconn, "Open new session when settings are loaded (flag)", 0},
{"keep_window", 'b', 1, &ns.keepwindow, "Keep window after connection closes (flag)", 0},
{"beep_sound", 's', 255, nssndname, "Beep sound name", 0},
{"keyboard_mapping", 's', 255, nskybdname, "Keyboard mapping name", 0},
{"national_language", 's', 255, nsnlname, "National language name", 0},
{"conn_type", 'c', 1, &ns.setsflg, "Connection type: 0 = standalone, 1 = serial, 2 = TCP/IP", max2proc},
{"timeout", 'c', 1, &ns.timeout, "Seconds between retransmits", 0},
{"retries", 'c', 1, &ns.retries, "Number of retries", 0},
{"debug_level", 'c', 1, &ns.dblevel, "Debugging level", 0},
{0, 0, 0, 0, 0, 0} }; /* marks end of list */
unsigned char setmsg1[256];
unsigned char setmsg2[256];
unsigned char setmsg3[256];
void read_settings(char initflg, cnr *cp)
{
Point where;
FileFilterProcPtr fileFilter;
DlgHookProcPtr dlgHook;
short numTypes;
SFTypeList typeList;
SFReply reply;
short appmsg, appcount, i;
AppFile appinfo;
if (initflg) { /* get files passed at launch time */
CountAppFiles(&appmsg, &appcount);
if (appcount == 0) return;
for (i=1; i <= appcount; i++) {
GetAppFiles(i, &appinfo);
if ((appmsg == 0) && (appinfo.fType == 'GFTS')) {
p2cstr(&appinfo.fName);
use_settings(&appinfo.fName, appinfo.vRefNum, cp);
}
ClrAppFiles(i);
}
}
else {
where = sfgpoint;
fileFilter = 0;
dlgHook = 0;
numTypes = 1;
typeList[0] = 'GFTS';
arrowcursor();
if (newroms && (cp != 0)) {
dlgautoconn = cp->cs.autoconn;
dlgHook = (DlgHookProcPtr)sfgethook;
SFPGetFile(where, "\pObtain settings from:", fileFilter,
numTypes, typeList, dlgHook, &reply, 4000, 0);
if (reply.good != 0) {
cp->cs.autoconn = dlgautoconn;
}
}
else {
dlgHook = 0;
SFGetFile(where, "\pObtain settings from:", fileFilter,
numTypes, typeList, dlgHook, &reply);
}
if (reply.good == 0) return;
p2cstr(&reply.fName);
use_settings(&reply.fName, reply.vRefNum, cp);
}
}
pascal short sfgethook(short MySFitem, DialogPtr theDialog)
{
if (MySFitem == -1) MySFitem = 24; /* switch arguments must be >= 0 */
switch (MySFitem) {
case 11:
dlgautoconn = 1;
setit(11, theDialog, dlgautoconn > 0);
setit(12, theDialog, dlgautoconn == 0);
break;
case 12:
dlgautoconn = 0;
setit(11, theDialog, dlgautoconn > 0);
setit(12, theDialog, dlgautoconn == 0);
break;
case 24: /* initialization */
setit(11, theDialog, dlgautoconn > 0);
setit(12, theDialog, dlgautoconn == 0);
break;
default:
break;
}
return(MySFitem);
}
void use_settings(unsigned char *fname, short vnum, cnr *cp)
{
OSErr rc;
char changed, update;
char oldformat;
/* start with default settings unless
updating the active session */
update = 0;
if (cp != 0) {
update = cp->cs.autoconn == 0;
}
if (update) {
ns = cp->cs;
strcpy(nshostname, cp->cshostname);
strcpy(nswtitle, cp->cswtitle);
strcpy(nskybdname, cp->cskybdname);
strcpy(nsnlname, cp->csnlname);
strcpy(nssndname, cp->cssndname);
}
else {
ns = ds;
strcpy(nshostname, dshostname);
strcpy(nswtitle, fname); /* filename is default window title */
strcpy(nskybdname, dskybdname);
strcpy(nsnlname, dsnlname);
strcpy(nssndname, dssndname);
}
rc = get_settings(fname, vnum, &oldformat);
if (rc != 0) return;
/* adjust for screen size */
adjfmt(&changed, &ns.windmax, &ns.dfltptsize, &ns.altptsize,
&ns.altrows, &ns.altcols);
if (changed) {
note_err(fmtalrt, cp);
}
if (update) { /* update current session */
cp->fsoldformat = oldformat;
settings_update(&ns, nswtitle, nskybdname, nsnlname, nssndname, cp);
}
else {
newlogin(0, 1, fname, vnum, oldformat);
}
}
short get_settings(unsigned char * fname, short vnum,
unsigned char *oldformat)
{
/* state table for reading definition file */
static unsigned char statetab[] =
/* 0 1 2 3 4 5 6 7 */
/* space char '=' '#' '"' CR other EOF */
/* 0: before name field */ { 0, 2, 10, 1, 10, 0, 10, 0,
/* 1: comment line */ 1, 1, 1, 1, 1, 0, 1, 0,
/* 2: reading name */ 3, 2, 4, 10, 10, 10, 10, 10,
/* 3: between name and =*/ 3, 10, 4, 10, 10, 10, 10, 10,
/* 4: between = and val */ 4, 5, 10, 10, 6, 10, 10, 10,
/* 5: reading value */ 8, 5, 10, 9, 10, 0, 10, 0,
/* 6: reading quote val */ 6, 6, 6, 6, 7, 10, 10, 10,
/* 7: quote in quote val*/ 8, 10, 10, 9, 6, 0, 10, 0,
/* 8: after value */ 8, 10, 10, 9, 10, 0, 10, 0,
/* 9: end comment */ 9, 9, 9, 9, 9, 0, 9, 0 };
/*10: error */
short fnum;
OSErr rc;
long filesize, l, readcount, lastoffset;
unsigned char * filedata;
unsigned char * nameptr;
short oldstate, state, charindex;
short linenum, namelen, valuelen;
short msg3len;
unsigned char *valuestr;
OSErr value_err;
int t[7];
short orig_windpth, orig_windptv;
nameptr = 0; /* just to avoid warning messages */
namelen = valuelen = 0;
valuestr = 0;
(*oldformat) = 0;
/* prepare first part of error messages */
sprintf(setmsg1, "Error reading settings file \"%s\":", fname);
/* null file line text */
setmsg3[0] = 0;
/* read definition file into buffer */
rc = fsrdopen(fname, vnum, &fnum);
if (rc != 0) {
sprintf(setmsg2, "Error %d opening file", rc);
seterr();
return(rc);
}
rc = GetEOF(fnum, &filesize); /* get file size */
if (rc != 0) {
FSClose(fnum);
sprintf(setmsg2, "Error %d getting file size", rc);
seterr();
return(rc);
}
filedata = (unsigned char *)NewPtr(filesize+1); /* allocate buffer */
/* extra byte for null termination */
if (filedata == 0L) {
FSClose(fnum);
sprintf(setmsg2, "Not enough storage (%ld bytes) for file", filesize);
seterr();
return(rc);
}
readcount = filesize; /* read file data */
rc = FSRead(fnum, &readcount, filedata);
FSClose(fnum); /* close file */
if ((rc != 0) || (readcount != filesize)) {
DisposPtr(filedata);
if (rc == 0) rc = 4;
sprintf(setmsg2, "Error %d reading file contents", rc);
seterr();
return(rc);
}
filedata[filesize] = 0; /* null-terminate */
/* check for the old file format */
/* try to read the attribute bytes */
rc = sscanf(filedata, "%x %x %x %x %x %x %x",
t, t+1, t+2, t+3, t+4, t+5, t+6);
if (rc == 7) { /* must be old format */
DisposPtr(filedata);
(*oldformat) = 1;
return(read_old_format(fname, vnum));
}
orig_windpth = ns.windpth; /* need to restore these if not saved in file */
orig_windptv = ns.windptv;
state = 0;
linenum = 1;
setmsg3[0] = '"';
msg3len = 1;
lastoffset = 0;
value_err = 0;
for (l=0; l <= filesize; l++) {
if (l < filesize) {
charindex = chrval(filedata[l]);
lastoffset = l;
}
else charindex = 7; /* EOF */
if ((charindex < 7) && (msg3len < 254) && (charindex != 5))
setmsg3[msg3len++] = filedata[l];
oldstate = state;
state = statetab[oldstate*8 + charindex];
if (state == 10) break;
if ((oldstate >= 5) && (state == 0)) {
if (valuelen == 0) { /* null strings can be parsed but are not allowed */
state = 10;
break;
}
valuestr[valuelen] = 0;
rc = setval(nameptr, namelen, valuestr, valuelen);
if (rc != 0) {
value_err = rc;
state = 10;
break;
}
}
if (charindex == 5) {
linenum++;
setmsg3[0] = '"';
msg3len = 1;
}
if (charindex < 4) {
switch(state) {
case 6:
if (oldstate >= 6) {
if (valuelen == 0) {
valuestr = filedata+l;
}
valuestr[valuelen++] = filedata[l];
}
break;
default:
break;
}
}
if (charindex == 1) {
switch(state) {
case 2:
if (oldstate == 2) {
namelen++;
}
else {
nameptr = filedata+l;
namelen = 1;
}
break;
case 5:
if (oldstate == 5) {
valuelen++;
}
else {
valuestr = filedata+l;
valuelen = 1;
}
break;
default:
break;
}
}
if (charindex == 4) {
switch(state) {
case 6:
if (oldstate == 4) {
valuelen = 0;
}
if (oldstate == 7) {
if (valuelen == 0) {
valuestr = filedata+l-1;
}
valuestr[valuelen++] = '"';
}
break;
default:
break;
}
}
}
DisposPtr(filedata);
if (state == 10) { /* error state */
if (value_err > 0) {
sprintf(setmsg2, "Value error %d on line %d:", value_err, linenum);
}
else {
sprintf(setmsg2, "Syntax error at position %ld on line %d:",
lastoffset, linenum);
}
setmsg3[msg3len++] = '"';
setmsg3[msg3len] = 0;
seterr();
setmsg3[0] = 0;
return(10);
}
if (ns.savewpos != 2) { /* restore window position if file values */
ns.windpth = orig_windpth; /* are not valid */
ns.windptv = orig_windptv;
}
return(0);
}
short chrval(unsigned char chr)
{
switch(chr) {
case '=':
return(2);
break;
case '#':
return(3);
break;
case '"':
return(4);
break;
case 0x0d:
return(5);
break;
default:
if (chr > 127) return(1);
if (isspace(chr)) return(0);
else if (iscntrl(chr)) return(6);
else return(1);
break;
}
}
short setval(unsigned char * nameptr,
short namelen,
unsigned char * valueptr,
short valuelen)
{
short i;
unsigned short u;
keyinfo * k;
unsigned char namesave;
short rc;
unsigned short r[10];
short (*procptr)(void *);
for (i=0; i < namelen; i++)
nameptr[i] = tolower(nameptr[i]);
namesave = nameptr[namelen];
nameptr[namelen] = 0;
valueptr[valuelen] = 0;
k = keytab;
while (k->size > 0) {
if (strcmp(nameptr, k->name) == 0) break;
k++;
}
nameptr[namelen] = namesave;
if (k->size == 0) return(1);
switch(k->type) {
case 'a': /* string of arbitrary length */
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
rc = alloc_copy((unsigned char **)(k->valptr), valueptr, valuelen);
if (rc != 0) return(14);
break;
case 'b': /* binary flag */
for (i=0; i < valuelen; i++)
if (!isdigit(valueptr[i])) return(3);
i = atoi(valueptr);
if ((i < 0) || (i > 1)) return(4);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
*((unsigned char *)k->valptr) = i;
break;
case 'c': /* unsigned char (decimal) */
for (i=0; i < valuelen; i++)
if (!isdigit(valueptr[i])) return(3);
i = atoi(valueptr);
if ((i < 0) || (i > 255)) return(4);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
*((unsigned char *)k->valptr) = i;
break;
case 'i': /* integer */
for (i=0; i < valuelen; i++) {
if (i == 0) {
if (valueptr[0] == '-') continue;
}
if (!isdigit(valueptr[i])) return(5);
}
i = atoi(valueptr);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
*((short *)(k->valptr)) = i;
break;
case 'l': /* list of hex values (space separated) */
if ((k->size < 1) || (k->size > 10)) return(7);
for (i=0; i < valuelen; i++)
if (!(isxdigit(valueptr[i]) || isspace(valueptr[i]))) return(8);
rc = sscanf(valueptr, "%hx %hx %hx %hx %hx %hx %hx %hx %hx %hx",
r, r+1, r+2, r+3, r+4, r+5, r+6, r+7, r+8, r+9);
if (rc != k->size) return(9);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
for (i=0; i < k->size; i++) {
((unsigned char *)(k->valptr))[i] = r[i];
}
break;
case 'o': /* OSType */
if (valuelen != 4) return(10);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
memcpy(k->valptr, valueptr, 4);
break;
case 'r': /* RGB color */
if ((k->size < 1) || (k->size > 10)) return(7);
for (i=0; i < valuelen; i++)
if (!(isdigit(valueptr[i]) || isspace(valueptr[i]))) return(8);
rc = sscanf(valueptr, "%hd %hd %hd %hd %hd %hd %hd %hd %hd %hd",
r, r+1, r+2, r+3, r+4, r+5, r+6, r+7, r+8, r+9);
if (rc != k->size) return(9);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
for (i=0; i < k->size; i++) {
((unsigned short *)(k->valptr))[i] = r[i];
}
break;
case 's': /* string */
if (valuelen > k->size) return(6);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
memset(k->valptr, 0, k->size+1);
memcpy(k->valptr, valueptr, valuelen);
break;
case 'u': /* unsigned integer */
for (i=0; i < valuelen; i++)
if (!isdigit(valueptr[i])) return(5);
u = atoi(valueptr);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&u);
if (rc != 0) return(rc);
}
*((unsigned short *)(k->valptr)) = u;
break;
case 'x': /* unsigned char (hex) */
for (i=0; i < valuelen; i++)
if (!isxdigit(valueptr[i])) return(11);
if (sscanf(valueptr, "%hx", &i) != 1) return(12);
if ((i < 0) || (i > 255)) return(13);
if (k->procptr != 0) {
procptr = k->procptr;
rc = (*procptr)(&i);
if (rc != 0) return(rc);
}
*((unsigned char *)k->valptr) = i;
break;
default:
return(2);
break;
}
return(0);
}
OSErr alloc_copy(unsigned char **dest,
unsigned char *source,
short len)
{
Size currentsize;
Ptr newvalptr;
(*dest)[0] = 0;
currentsize = GetPtrSize(*dest);
if (currentsize < (len+1)) {
newvalptr = NewPtr((Size)(len+1));
if (newvalptr == 0) {
return(1);
}
else {
DisposPtr(*dest);
*dest = newvalptr;
currentsize = len+1;
}
}
memset(*dest, 0, currentsize);
memcpy(*dest, source, len);
return(0);
}
short ptsizeproc(void *resultptr)
{
char num;
num = *((short *)resultptr);
if ((num == 9) || (num == 12)) return(0);
return(1);
}
short rowproc(void *resultptr)
{
char num;
num = *((short *)resultptr);
if (num >= 24) return(0);
return(1);
}
short colproc(void *resultptr)
{
char num;
num = *((short *)resultptr);
if (num >= 80) return(0);
return(1);
}
short max2proc(void *resultptr)
{
char num;
num = *((short *)resultptr);
if ((num >= 0) && (num <= 2)) return(0);
return(1);
}
short pfproc(void *resultptr)
{
short num;
num = *((short *)resultptr);
if ((num >= 1) && (num <= 32)) return(0);
return(1);
}
OSErr read_old_format(char *fname, short vnum)
{
short fnum;
OSErr rc;
long count;
int t[70];
short colors[27];
unsigned char buffer[800];
unsigned char tstring[256];
unsigned char tstring2[256];
unsigned char tstring3[256];
unsigned char tstring4[256];
unsigned char tstring5[256];
short tlen, tnum;
char scan_ok;
short i;
short tcount;
char tsave;
unsigned char * tptr, * tend;
rc = fsrdopen(fname, vnum, &fnum);
if (rc != 0) {
stoperr(rsetalrt, 0);
return(rc);
}
count = 798;
rc = FSRead(fnum, &count, buffer);
FSClose(fnum);
if ((rc != 0) && (rc != eofErr)) {
stoperr(rsetalrt, 0);
return(rc);
}
buffer[count] = 0; /* terminate C string */
tptr = buffer; /* initialize token pointer */
tcount = 0; /* initialize token count */
while (1) {
while (isspace(*tptr)) tptr++;
if ((*tptr) == 0) break;
tend = tptr;
while ((!isspace(*tend)) && ((*tend) != 0)) tend++;
tsave = (*tend);
(*tend) = 0;
if (tcount < 7) rc = sscanf(tptr, "%x", t+tcount);
else if (tcount == 7) rc = sscanf(tptr, "%d", t+tcount);
else if (tcount == 8) rc = sscanf(tptr, "%s", tstring);
else if (tcount < 18) rc = sscanf(tptr, "%d", t+tcount-1);
else if (tcount < 45) rc = sscanf(tptr, "%x", t+tcount-1);
else if (tcount < 47) rc = sscanf(tptr, "%d", t+tcount-1);
else if (tcount < 57) rc = sscanf(tptr, "%x", t+tcount-1);
else if (tcount == 57) rc = sscanf(tptr, "%s", tstring2);
else if (tcount < 59) rc = sscanf(tptr, "%x", t+tcount-2);
else if (tcount == 59) rc = sscanf(tptr, "%s", tstring3);
else if (tcount < 64) rc = sscanf(tptr, "%d", t+tcount-3);
else if (tcount == 64) rc = sscanf(tptr, "%s", tstring4);
else if (tcount < 71) rc = sscanf(tptr, "%x", t+tcount-4);
else if (tcount == 71) rc = sscanf(tptr, "%s", tstring5);
else if (tcount < 75) rc = sscanf(tptr, "%x", t+tcount-5);
if (rc != 1) break;
tcount++;
if (tcount == 75) break;
(*tend) = tsave;
tptr = tend;
}
/* check validity of data */
scan_ok = 0;
if ((tcount == 16) || (tcount >= 45)) {
scan_ok = 1;
/* host name */
tlen = strlen(tstring);
if ((tlen > 255) || (tlen == 0)) scan_ok = 0;
if (strcmp(tstring, "''") == 0) tstring[0] = '\0';
/* t array */
/* tnum = number of array elements used */
tnum = tcount;
/* adjust for string settings */
if (tcount > 8) tnum--;
if (tcount > 57) tnum--;
if (tcount > 59) tnum--;
if (tcount > 64) tnum--;
if (tcount > 71) tnum--;
for (i = 7; i < tnum; i++) {
if ((i >= 17) && (i <= 43)) continue; /* skip colors */
if ((i >= 50) && (i <= 52)) continue; /* status line color */
switch(i) {
case 8: /* connection type */
case 47: /* status line time */
if ((t[i] < 0) || (t[i] > 2)) scan_ok = 0;
break;
case 14: /* double-click */
if ((t[i] < 1) || (t[i] > 36)) scan_ok = 0;
break;
case 44: /* alternate rows */
case 59: /* custom rows */
if (t[i] < 24) scan_ok = 0;
break;
case 58: /* alternate columns */
case 60: /* custom columns */
if (t[i] < 80) scan_ok = 0;
break;
case 45: /* alternate font size*/
case 57: /* default font size */
if ((t[i] != 9) && (t[i] != 12)) scan_ok = 0;
break;
case 7: /* debug level */
case 9: /* timeout */
case 10: /* retries */
case 62: /* window h pos */
case 63: /* window v pos */
case 65: /* text creator */
break;
case 61: /* savewpos */
if ((t[i] < 0) || (t[i] > 2)) scan_ok = 0;
break;
default: /* boolean flags */
if ((t[i] != 0) && (t[i] != 1)) scan_ok = 0;
break;
}
}
if (tcount >= 58) {
tlen = strlen(tstring2); /* keymap name */
if ((tlen > 255) || (tlen == 0)) scan_ok = 0;
}
if (tcount >= 60) {
tlen = strlen(tstring3); /* national language */
if ((tlen > 255) || (tlen == 0)) scan_ok = 0;
}
if (tcount >= 65) {
tlen = strlen(tstring4); /* 'snd ' name */
if ((tlen > 255) || (tlen == 0)) scan_ok = 0;
}
if (tcount >= 72) {
tlen = strlen(tstring5); /* 'snd ' name */
if ((tlen > 255) || (tlen == 0)) scan_ok = 0;
}
/* check window position present if saved */
if (tcount >= 66) {
if ((t[61] == 2) && (tcount < 68)) scan_ok = 0;
}
}
if (scan_ok == 0) {
stoperr(ssetalrt, 0);
return(1);
}
for (i=0; i < 7; i++) ns.attrmap[i] = t[i];
ns.dblevel = t[7];
ns.setsflg = t[8];
strcpy(nshostname, tstring);
ns.timeout = t[9];
ns.retries = t[10];
ns.insreset = t[11];
ns.impnull = t[12];
ns.digitpfk = t[13];
ns.mousepf = t[14];
if (tcount >= 45) {
ns.basecolor = t[15];
ns.exactcolor = t[16];
for (i=0; i < 27; i++) colors[i] = t[i+17];
memcpy(&ns.usrwhite, colors, 54);
}
if (tcount >= 48) ns.invertbw = t[46];
if (tcount >= 49) ns.stat_time = t[47];
if (tcount >= 50) ns.curpos = t[48];
if (tcount >= 51) ns.blockcurs = t[49];
if (tcount >= 54) {
ns.usrstat.red = t[50];
ns.usrstat.green = t[51];
ns.usrstat.blue = t[52];
}
if (tcount >= 55) ns.ext3270 = t[53];
if (tcount >= 56) ns.std_brack = t[54];
if (tcount >= 58) copyrdstr(nskybdname, tstring2);
if (tcount >= 59) ns.repnull = t[56];
if (tcount >= 60) copyrdstr(nsnlname, tstring3);
/* handle screen format settings */
if (tcount >= 61) { /* new format */
ns.altrows = t[44];
ns.altptsize = t[45];
ns.windmax = t[55];
ns.dfltptsize = t[57];
if (tcount >= 62) ns.altcols = t[58];
if (tcount >= 63) ns.custrows = t[59];
if (tcount >= 64) ns.custcols = t[60];
}
else { /* old format */
if (tcount >= 46) ns.altrows = t[44];
if (tcount >= 47)
ns.altptsize = ns.dfltptsize = t[45];
if (tcount >= 57) ns.windmax = t[55];
ns.altcols = 80;
}
if (tcount >= 65) copyrdstr(nssndname, tstring4);
/* handle window position settings */
if (tcount >= 66) {
ns.savewpos = t[61]; /* changed to (t[61] > 0) by caller */
if (t[61] == 2) {
ns.windpth = t[62];
ns.windptv = t[63];
}
}
if (tcount >= 69) ns.autoconn = t[64];
if (tcount >= 70) ns.text_creator = t[65];
if (tcount >= 71) ns.simps = t[66];
if (tcount >= 72) copyrdstr(nswtitle, tstring5);
if (tcount >= 73) ns.keepwindow = t[67];
if (tcount >= 74) ns.nographics = t[68];
if (tcount >= 75) ns.nocolor = t[69];
return(0);
}
void copyrdstr(unsigned char *dest, unsigned char *source)
{
/* copy string, converting underscores to blanks */
register short i, j, len;
register char usflag;
len = strlen(source);
j = 0;
usflag = 0;
for (i=0; i < len; i++) {
if (source[i] == '_') {
if (usflag) {
dest[j++] = '_';
usflag = 0;
}
else {
usflag = 1;
}
}
else {
if (usflag) {
dest[j++] = ' ';
usflag = 0;
if (j == 255) break;
dest[j++] = source[i];
}
else {
dest[j++] = source[i];
}
}
if (j == 255) break;
}
if (usflag && (j < 255)) {
dest[j++] = ' ';
}
dest[j] = 0;
}
void settings_update(settings_list *sl,
unsigned char *wtitle,
unsigned char *kybdname,
unsigned char *nlname,
unsigned char *sndname, cnr* cp)
{
static unsigned char * ScrDmpEnb = (unsigned char *)0x2f8;
char setsflg;
short altrows, altcols;
OSErr rc;
Handle temph, temph2;
unsigned char tstring[256];
short rid;
ResType rtype;
/* save settings that we don't want
changed by structure assignment */
setsflg = cp->cs.setsflg; /* connection type */
altrows = cp->cs.altrows; /* alternate screen size */
altcols = cp->cs.altcols;
/* copy settings */
cp->cs = cp->fs = *sl;
strcpy(cp->fswtitle, wtitle);
strcpy(cp->cswtitle, wtitle);
strcpy(cp->fskybdname, kybdname); /* "cs" values for these are changed */
strcpy(cp->fsnlname, nlname); /* when resources are checked */
strcpy(cp->fssndname, sndname);
cp->cs.setsflg = setsflg; /* restore connection type */
cp->serflg = (cp->cs.setsflg == 1);
cp->tcpflg = (cp->cs.setsflg == 2);
if (cp->myWindow != 0) { /* command-shift enable */
if (cp->cs.digitpfk) (*ScrDmpEnb) = 0;
else (*ScrDmpEnb) = ScrDmpSav;
}
/* set new colors */
if (colormac && (!cp->cs.nocolor) && (cp->myWindow != 0)) {
fixcolors(cp->myPalette, cp);
ActivatePalette(cp->myWindow);
updCTab(cp);
newbackcolor(cp);
}
/* handle window position */
cp->cs.savewpos = cp->fs.savewpos = (sl->savewpos > 0);
if (sl->savewpos == 2) cp->wposok = 1;
/* check for new screen size */
if ((cp->cs.altcols != altcols) || /* size changed */
(cp->cs.altrows != altrows)) {
cp->cs.altcols = altcols; /* restore size */
cp->cs.altrows = altrows;
note_err(windfmtalrt, cp); /* new size warning */
}
else if (cp->myWindow != 0) { /* change active session size */
newmode(cp->cur_mode, 0, cp);
}
/* new cursor shape */
if (cp->myWindow != 0) newcur(cp);
cp->fixbracket = /* flag for square brackets */
cp->cs.std_brack && (!cp->aplmode) && (cp->stdfont != ALAFONT);
/* update keyboard mapping */
c2pstr(cp->fskybdname);
temph = GetNamedResource('GFKB', cp->fskybdname);
p2cstr(cp->fskybdname);
if (temph == 0L) {
stoperr(kbsetalrt, cp);
}
else {
cp->kb_handle = temph;
GetResInfo(cp->kb_handle, &rid, &rtype, tstring);
p2cstr(tstring);
strcpy(cp->fskybdname, tstring);
strcpy(cp->cskybdname, tstring);
}
/* update national language setting */
/* check for default */
GetItem(nlMenu, 1, tstring);
p2cstr(tstring);
if (strcmp(tstring, cp->fsnlname) == 0) {
strcpy(cp->csnlname, tstring);
cp->nl_handle = 0;
newstdfont(NORMALFONT, cp);
cp->plainala = 0;
}
/* check resource */
else {
c2pstr(cp->fsnlname);
temph = GetNamedResource('GFNL', cp->fsnlname);
p2cstr(cp->fsnlname);
if (temph == 0L) {
stoperr(nlsetalrt, cp);
}
else {
GetResInfo(temph, &rid, &rtype, tstring);
p2cstr(tstring);
strcpy(cp->fsnlname, tstring);
strcpy(cp->csnlname, tstring);
if (GetHandleSize(temph) == 1) {
cp->nl_handle = 0;
newstdfont(**temph, cp);
cp->plainala = 0;
}
else if (GetHandleSize(temph) == 3) {
cp->nl_handle = 0;
newstdfont(**temph, cp);
cp->plainala = ((*temph)[1] & 0x80) == 0x80;
}
else {
cp->nl_handle = temph;
defxtab(cp->nl_handle, cp->nltab);
newstdfont(NORMALFONT, cp);
cp->plainala = 0;
}
}
}
/* get non-purgeable copy of our sound resource */
if (strcmp(cp->fssndname, dssndname) == 0) {
if (sndactive) {
SndDisposeChannel(scp, true);
sndactive = 0;
}
if (cp->sndhandle != 0) DisposHandle(cp->sndhandle);
cp->sndhandle = 0;
strcpy(cp->cssndname, cp->fssndname);
}
else {
temph = temph2 = getsndresource(cp->fssndname);
if (temph == 0L) {
stoperr(sdsetalrt, cp);
}
else {
rc = HandToHand(&temph2);
if (rc != noErr) {
ReleaseResource(temph);
stoperr(sdmemalrt, cp);
}
else {
getsndinfo(temph, &rid, &rtype, tstring);
ReleaseResource(temph);
if (sndactive) {
SndDisposeChannel(scp, true);
sndactive = 0;
}
if (cp->sndhandle != 0) DisposHandle(cp->sndhandle);
cp->sndhandle = temph2;
strcpy(cp->fssndname, tstring);
strcpy(cp->cssndname, tstring);
}
}
}
if (cp->myWindow == 0) return;
justGrowIcon(0, cp);
invldscr(cp);
cp->cs.stat_time += 8; /* force time to be re-drawn */
newstat(cp);
newinvbw(cp);
/* note: window title is intentionally not updated */
}
void write_settings(cnr *cp)
{
Point where;
DlgHookProcPtr dlgHook;
SFReply reply;
OSErr rc;
short fnum, i, j, m;
short savewpos;
keyinfo * k;
char writeok;
unsigned char s[WRITEBUFFSIZE];
unsigned char crtemp[5];
unsigned char *strval;
unsigned char c;
long count;
where = sfppoint;
dlgHook = 0;
arrowcursor();
c2pstr(cp->s_fName);
SFPutFile(where, "\pSave settings as:",
cp->s_fName, dlgHook, &reply);
p2cstr(cp->s_fName);
if (reply.good == 0) return;
p2cstr(&reply.fName);
memcpy(cp->s_fName, &reply.fName, 64); /* save filename */
c2pstr(&reply.fName);
rc = FSDelete(&reply.fName, reply.vRefNum); /* delete existing file */
if ((rc != 0) && (rc != -43)) { /* file not found is ok */
stoperr(wsetalrt, cp);
return;
}
rc = Create(&reply.fName, reply.vRefNum, 'GFTM', 'GFTS');
if (rc != 0) {
stoperr(wsetalrt, cp);
return;
}
rc = FSOpen(&reply.fName, reply.vRefNum, &fnum);
if (rc != 0) {
stoperr(wsetalrt, cp);
return;
}
/* update window position settings */
updwindpos(cp);
savewpos = cp->cs.savewpos;
if (savewpos && cp->wposok) savewpos = 2;
/* save current values as file values */
memcpy(cp->fshostname, cp->cshostname, 256);
memcpy(cp->fskybdname, cp->cskybdname, 256);
memcpy(cp->fsnlname, cp->csnlname, 256);
memcpy(cp->fssndname, cp->cssndname, 256);
memcpy(cp->fswtitle, cp->cswtitle, 256);
cp->fs = cp->cs;
cp->fsoldformat = 0; /* file settings will be new format */
/* also copy to "ns" variables for writing */
memcpy(nshostname, cp->cshostname, 256);
memcpy(nskybdname, cp->cskybdname, 256);
memcpy(nsnlname, cp->csnlname, 256);
memcpy(nssndname, cp->cssndname, 256);
memcpy(nswtitle, cp->cswtitle, 256);
ns = cp->cs;
ns.savewpos = savewpos;
/* write each value */
k = keytab;
writeok = 1;
while (k->size != 0) {
s[0] = 0;
switch (k->type) {
case 'b':
sprintf(s, "%s=%d \t#%s\015", k->name,
*((unsigned char *)k->valptr), k->description);
break;
case 'c':
sprintf(s, "%s=%d \t#%s\015", k->name,
*((unsigned char *)k->valptr), k->description);
break;
case 'i':
sprintf(s, "%s=%d \t#%s\015", k->name,
*((short *)k->valptr), k->description);
break;
case 'l':
sprintf(s, "%s=\"%x", k->name, ((unsigned char *)k->valptr)[0]);
m = strlen(s);
if (k->size > 1) {
for (i=1; i < k->size; i++) {
sprintf(s+m, " %x", ((unsigned char *)k->valptr)[i]);
m = strlen(s);
}
}
sprintf(s+m, "\" \t#%s\015", k->description);
break;
case 'o':
memcpy(crtemp, k->valptr, 4);
crtemp[4] = 0;
sprintf(s, "%s=\"%s\" \t#%s\015", k->name,
crtemp, k->description);
break;
case 'r':
sprintf(s, "%s=\"%d", k->name, ((unsigned short *)k->valptr)[0]);
m = strlen(s);
if (k->size > 1) {
for (i=1; i < k->size; i++) {
sprintf(s+m, " %d", ((unsigned short *)k->valptr)[i]);
m = strlen(s);
}
}
sprintf(s+m, "\" \t#%s\015", k->description);
break;
case 'a': /* arbitrary length string */
case 's': /* fixed-length string */
if (k->type == 'a') {
strval = *((unsigned char **)k->valptr);
}
else {
strval = (unsigned char *)k->valptr;
}
if (strval[0] == 0) break;
sprintf(s, "%s=\"", k->name);
m = strlen(s);
j = 0;
while(strval[j] != 0) {
if (m > WRITEBUFFSIZE-2) {
count = m;
rc = FSWrite(fnum, &count, s);
if (rc != 0) {
stoperr(wsetalrt, cp);
writeok = 0;
break;
}
m = 0;
}
c = s[m++] = strval[j++];
if (c == '"') s[m++] = '"';
}
if (!writeok) break;
count = m;
rc = FSWrite(fnum, &count, s);
if (rc != 0) {
stoperr(wsetalrt, cp);
writeok = 0;
break;
}
sprintf(s, "\" \t#%s\015", k->description);
break;
case 'u':
sprintf(s, "%s=%d \t#%s\015", k->name,
*((unsigned short *)k->valptr), k->description);
break;
case 'x':
sprintf(s, "%s=%x \t#%s\015", k->name,
*((unsigned char *)k->valptr), k->description);
break;
default:
break;
}
if (!writeok) break;
count = strlen(s);
rc = 0;
if (count > 0) {
rc = FSWrite(fnum, &count, s);
}
if (rc != 0) {
stoperr(wsetalrt, cp);
break;
}
k++;
}
rc = FSClose(fnum);
if (rc != 0) {
stoperr(wsetalrt, cp);
}
}
short new_settings(cnr *cp)
{
short savepth, saveptv, rc;
if (strcmp(cp->cshostname, cp->fshostname) != 0) return(1);
if (strcmp(cp->cskybdname, cp->fskybdname) != 0) return(1);
if (strcmp(cp->csnlname, cp->fsnlname) != 0) return(1);
if (strcmp(cp->cssndname, cp->fssndname) != 0) return(1);
/* compare all other settings, except window position */
savepth = cp->fs.windpth;
saveptv = cp->fs.windptv;
cp->fs.windpth = cp->cs.windpth;
cp->fs.windptv = cp->cs.windptv;
rc = (cp->fs != cp->cs);
cp->fs.windpth = savepth;
cp->fs.windptv = saveptv;
return(rc);
}
OSErr fsrdopen(unsigned char *fname, short vref, short *fref)
{ /* open file read-only */
IOParam pbi;
OSErr rc;
/* initialize parameter block */
memset(&pbi, 0, sizeof(IOParam));
pbi.ioNamePtr = (StringPtr)fname;
pbi.ioVRefNum = vref;
pbi.ioPermssn = fsRdPerm;
c2pstr(fname);
rc = PBOpen((ParmBlkPtr)&pbi, 0);
*fref = pbi.ioRefNum;
p2cstr(fname);
return(rc);
}
void copyconfig(settings_list *sl, /* set session config. variables */
unsigned char *hostname,
unsigned char *wtitle)
{
cf_dblevel = sl->dblevel;
cf_setsflg = sl->setsflg;
cf_timeout = sl->timeout;
cf_retries = sl->retries;
cf_dfltptsize = sl->dfltptsize;
cf_altptsize = sl->altptsize;
cf_altrows = sl->altrows;
cf_altcols = sl->altcols;
cf_windmax = sl->windmax;
cf_custrows = sl->custrows;
cf_custcols = sl->custcols;
cf_savewpos = sl->savewpos;
cf_ext3270 = sl->ext3270;
cf_nographics = sl->nographics;
cf_nocolor = sl->nocolor;
strcpy(cf_hostname, hostname);
strcpy(cf_wtitle, wtitle);
}